---
title: 统一建模语言UML
description: UML 中分为事物、关系、图，重点是图；承接了面向对象分析和设计的一些模型。
---

在面向对象分析和设计过程中，主要就是做 UML 的建模。
## 基本概念

UML（统一建模语言）：是一种<font color='RedOrange'>可视化的建模语言，而非程序设计语言</font>，支持从需求分析开始的软件开发的全过程。

从总体上来看， UML 的结构包括<font color='RedOrange'>构造块、规则和公共机制</font>三个部分。
1. 构造块。UML 有三种基本的构造块，分别是<font color='RedOrange'>事物（thing）、关系（relationship）和图（diagram）</font>。事物是 UML 的重要组成部分，关系把事物紧密联系在一起， 图是多个相互关联事物的集合。
2. 公共机制：公共机制是指达到特定目标的公共 UML 方法。
3. 规则：规则是构造块如何放在一起的规定。

## 事物

下图是一些图形的表示，图形是由事物组成的。

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B418F5914-5AE1-4F5F-8E53-58A769C1D955%7D.png"/>

* 结构事物：模型的静态部分，如类、接口、用例、构件等；
* 行为事物：模型的动态部分，如交互、活动、状态机；
* 分组事物：模型的组织部分，如包；
* 注释事物： 模型的解释部分，依附于一个元素或一组元素之上对其进行约束或解释的简单符号。

## 关系
事物之间的关系一共分为四大类

* 依赖：<font color='RedOrange'>一个事物的语义依赖于另一个事物的语义的变化而变化</font>，箭头方向指向被依赖方。
* 关联：是一种结构关系（现实世界中存在最广泛的关系，几乎代表了一切关系），描述了一组链，链是对象之间的连接。<font color='RedOrange'>分为组合和聚合，都是部分和整体的关系</font>，其中组合事物之间关系更强（它们是具有共同的生命周期的）。两个类之间的关联，实际上是两个类所扮演角色的关联，因此，两个类之间可以有多个由不同角色标识的关联。
    * 组合：比如人和人的大脑，有共同的生命周期。
    * 聚合：部分和整体之间没有共同的生命周期，比如雁群和大雁，大雁可以随时脱离雁群。
    * 关联关系两端还应该有数字，表示对应关系
* 泛化：<font color='RedOrange'>一般/特殊的关系</font>，子类和父类的关系（学生，泛化为高中生、研究生...）。
* 实现：<font color='RedOrange'>一个类元制定了另一个类元保证执行的契约</font>。

<img alt={'关系的符号，必须要记住'} src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B9061EB06-A6A6-4E78-825F-2CDA3DACB5B5%7D.png"/>

## 图
把事物和关系表现在一张图中

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B4DE1CCB1-9E1F-40E7-ACAF-EAB7E543964F%7D.png" alt={'图分类'}/>


虚线框起来的又叫做交互图，也叫做动态图

### 类图
类图是静态图，为系统的<font color='RedOrange'>静态设计视图</font>，展现一组<font color='RedOrange'>对象、接口、协作和它们之间的关系</font>。

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B900D25A4-8F1A-4C6D-B217-5513E25F0EBA%7D.png"/>

### 对象图
对象图是静态图，展现某一时刻一组对象及它们之间的关系，为类图的某一快照。在没有类图的前提下，对象图就是静态设计视图。如下：

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B527CD981-E2CC-4EF0-9E27-5BB92ED20F2B%7D.png"/>

### 用例图
用例图展现了<font color='RedOrange'>一组用例、参与者以及它们之间的关系</font>。用例图中的参与者是人、硬件或其他系统可以扮演的角色；用例是参与者完成的一系列操作，用例之间的关系有 <font color='RedOrange'>扩展、包含、泛化</font>，属于用例图里面特有的关系。

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B82A15622-EE3D-4149-B302-CC40F8A2F31D%7D.png"/>

* 参与者：人、硬件或其它系统可以扮演的角色，可以和系统交互。
* 用例：就是功能（需求），比如 新增书籍信息、查询书籍信息、修改书籍信息、登记外借信息、用户登录、统计金额与册数、查询外借信息
* 用例之间有三个重要的关系，扩展：当执行某个操作时，另一个操作可做可不做（比如查询完可以选择修改，也可以选择不修改）、包含（include）当执行某个操作时，必须执行另一个操作、泛化表示父子关系，在图中没有画出来。

:::tip
 用例（use case）用来描述系统对事件做出响应时所采取的行动。用例之间是具有相关性的。在一个会员管理系统中，会员注册可以采用电话和邮件两种方式。用例“会员注册”和“电话注册”、“邮件注册”之间就是泛化关系（generalize）
:::
### <font color='RedOrange'>序列图</font>
即顺序图，动态图，是场景的图形化表示，描述了<font color='RedOrange'>以时间顺序组织的对象之间的交互活动</font>。有**同步消息**（进行阻塞调用，调用者中止执行，等待控制权返回，需要等待返回消息，用实心三角箭头表示），**异步消息**（发出消息后继续执行，不引起调用者阻塞，也不等待返回消息，由空心箭头表示）、**返回消息**（由从右到左的虚线箭头表示）三种。如下；

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B96BED80D-3A1E-48D2-B0A9-FC3BFD02C679%7D.png"/>

生命线可以理解为时间线，横向箭头表示消息，有三种消息。
### 通信图（了解）


通信图即<font color='RedOrange'>协作图，强调参加交互的对象的组织</font>。如下：

也是描述传递消息的，只不过是按照序号描述

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7BBCB1E2FE-B3D3-42F2-BA23-B15E8F8467E5%7D.png"/>


### <font color='RedOrange'>状态图</font>
动态图，展现了一个状态机，描述<font color='RedOrange'>单个对象在多个用例中的行为</font>，包括简单状态和组合状态。转换可以通过<font color='RedOrange'>事件触发器触发</font>，事件触发后相应的<font color='RedOrange'>监护条件</font>会进行检查。状态图中转换和状态是两个独立的概念，如下：图中方框代表状态，箭头上的代表触发事件，实心圆点为起点和终点。
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B194CBB44-A12D-420B-9095-30856EAE5F9A%7D.png"/>

状态转换需要先触发事件，然后满足监护条件。

状态图可以没有终点，但是不能没有起点。
### <font color='RedOrange'>活动图</font>
动态图，是一种<font color='RedOrange'>特殊的状态图</font>，展现了<font color='RedOrange'>在系统内从一个活动到另一个活动的流程</font>。活动的分岔和汇合线是一条水平粗线。牢记下图中<font color='RedOrange'>并发分岔、并发汇合、监护表达式、分支、流</font>等名词及含义。每个分岔的分支数代表了可同时运行的线程数。活动图中能够并行执行的是在同一个分岔粗线下的分支上的活动。

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B458CBD1D-8F35-4CEA-832E-A69749AAB2AD%7D.png"/>



### 构件图(组件图)

静态图，为<font color='RedOrange'>系统实现视图，展现了一组构件之间的组织和依赖</font>。如下：

构件可以理解为是可复用的模块，一个构件可能是由多个类组成的。


<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B43C8A96D-878F-49E4-A889-19D303283455%7D.png" alt={'构件图'}/>

### 部署图
只要涉及到硬件上的东西，毫无疑问都是部署图

静态图,为<font color='RedOrange'>系统静态部署视图</font>，部署图<font color='RedOrange'>物理模块</font>的节点分布。它与构件图相关，通常一个结点包含一个或多个构件。其依赖关系类似于包依赖，因此部署组件之间的依赖是单向的类似于包含关系。如下：

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B85E0C5E9-60C2-4F97-9CF2-F9878D76A9A5%7D.png" alt="部署图"/>

## UML 4+1 视图

视图是逻辑上的概念，比图的概念更抽象，是图的抽象。视图提出的概念是由图来实现的。

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/%7B127AD522-5FD6-4D52-BDA6-95C0D471D60B%7D.png"/>

1. 逻辑视图。逻辑上视图也称为<font color='RedOrange'>设计视图</font>，它表示了设计模型在架构方面具有重要意义的部分，即<font color='RedOrange'>类、子系统、包和用例实现的子集</font>。
2. 进程视图。进程视图是<font color='RedOrange'>可执行线程和进程作为活动类的建模</font>，它是<font color='RedOrange'>逻辑视图的一次执行实例，描述了并发与同步结构</font>。
3. 实现视图。实现视图对组成基于系统的<font color='RedOrange'>物理代码的文件和构件进行建模</font>
4. 部署视图。部署视图把<font color='RedOrange'>构件部署到一组物理节点上</font>，表示软件到硬件的映射和分布结构。
5. 用例视图。用例视图是<font color='RedOrange'>最基本的需求分析模型</font>